/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package comunicacao;

import javax.microedition.io.StreamConnectionNotifier;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.Connector;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.LocalDevice;
import java.io.DataInputStream;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.util.Vector;
import jogo.JogoServidor;
import util.*;

/**
 *
 * @author Thiago Nascimento e Pablo Viana
 */
public class Servidor extends Thread {

    // ATRIBUTOS DA CONEXAO ////////////////////////////////////////////////////
    private StreamConnectionNotifier notifier;
    private StreamConnection conn;
    private LocalDevice localDevice;
    private InputStream input;
    private OutputStream output;
    // FLUXO DO JOGO ///////////////////////////////////////////////////////////
    private JogoServidor jogo;

    public Servidor(JogoServidor jogo) {
        this.jogo = jogo;
        System.out.println("Servidor.Servidor(): criou o servidor");
    }

    public void comecarPartida(int dif) {
        this.jogo.setNivelDificuldadeBot(dif);
        this.jogo.comecarPartida();
    }

    private DataInputStream recebendoConexao() throws IOException {
        conn = notifier.acceptAndOpen();
        input = conn.openInputStream();
        output = conn.openOutputStream();
        System.out.println("Servidor.recebendoConexao(): conexao recebida");

        return new DataInputStream(input);
    }

    private void enviarPacote(Vector dados) throws IOException {
        output.write(Util.empacotarParametros(dados));
        output.flush();
        System.out.println("Servidor.enviarPacote(): enviou resposta");
    }

    public void run() {
        // Inicializa o device de conexoes
        try {
            String serverUrl = Constantes.SERVER_URL;
            localDevice = LocalDevice.getLocalDevice();
            localDevice.setDiscoverable(DiscoveryAgent.GIAC);
            notifier = (StreamConnectionNotifier) Connector.open(serverUrl);
            System.out.println("Servidor.run(): servidor aberto com sucesso");
        } catch (Exception e) {
            System.out.println("Servidor.run(): erro criando servidor do jogo");

        }
        DataInputStream dados;
        Vector resposta;
        int pacote;

        while (true) {
            try {
                dados = recebendoConexao();
                pacote = dados.readInt(); //descobrir pacote
                    
                // Trata as conexoes de entrada na partida ate que o usuario inicie o jogo
                if (this.jogo.getStatus() == Constantes.STATUS_ESPERANDO_INICIAR) {
                    switch (pacote) {
                        case Constantes.PACOTE_STATUS:
                            resposta = this.jogo.gerarStatusIniciando(dados.readUTF());
                            this.enviarPacote(resposta);
                            break;
                        case Constantes.PACOTE_CONECTAR:
                            this.jogo.conectarJogador(dados.readUTF());
                            break;
                        default:
                            System.out.println("Servidor.run(): servidor recebeu um pacote maluco");
                    }
                }

                // Trata as conexoes de status do jogo e das jogadas efetuadas
                if (this.jogo.getStatus() == Constantes.STATUS_ESPERANDO_JOGADA) {
                    switch (pacote) {
                        case Constantes.PACOTE_STATUS:
                            resposta = this.jogo.gerarStatusJogada(dados.readUTF(), dados.readInt(), dados.readInt());
                            this.enviarPacote(resposta);
                            break;
                        case Constantes.PACOTE_JOGAR:
                            this.jogo.realizarJogada(dados);
                            break;
                        default:
                            System.out.println("Servidor.run(): servidor recebeu um pacote maluco");
                    }
                }

            } catch (IOException e) {
                System.out.println("Servidor.run(): Excecao no servidor lendo pacote");
            } catch (Exception e) {                
                System.out.println("Servidor.run(): excecao fechar servidor: ");
                e.printStackTrace();
                return;
            }
        }

    }
}
